const fs = require("fs");
const Path = require("path");

// 导入控制台彩色输出
const Color = require("colors-console");
const { constants } = require("buffer");
// MarkDown 文件地址
var markDownPath = "D:\\project\\mark-down";
// 文件总数
var count = 0;
// 图片文件类型
var imgTypes = ["png", "gif", "jpg", "svg"];
// 遍历文件夹中的所有文件
var regexpImage = /\!\[\]\(\S*\)/g;
// markdown 文件生成地址
var baseTarget = Path.join(__dirname, "/source/_posts/");

console.log(Color("green", "====================[开始运行]===================="));

const promise = new Promise((resolve, reject) => {
  readDir(markDownPath);
  resolve();
});

promise.then((result) => {
  console.log("成功");
});

function readDir(path) {
  fs.readdir(path, (err, files) => {
    if (err) {
      console.log(err);
    }
    files.forEach((file) => {
      if (file == ".git") {
        return;
      }
      var filePath = Path.join(path, file);
      fs.stat(filePath, (err, stats) => {
        if (stats.isDirectory()) {
          readDir(filePath);
        } else {
          count++;
          if (imgTypes.includes(file.substring(file.indexOf(".") + 1))) {
            var targetImgPath = Path.join(__dirname, "/source/img/", file);
            fs.access(targetImgPath, constants.F_OK, (err) => {
              if (err) {
                console.log(
                  Color("yellow", "[图片不存在]" + filePath + "==>准备迁移==>" + targetImgPath)
                );

                // 迁移图片
                fs.copyFile(filePath, targetImgPath, (err) => {
                  if (err) {
                    console.log(Color("red", "[迁移失败]" + err.message));
                  } else {
                    console.log(Color("green", "[迁移成功]" + filePath + "-->" + targetImgPath));
                  }
                });
              } else {
                console.log(Color("blue", "[图片已存在]" + targetImgPath));
              }
            });
          } else {
            // 判断文件是否修改
            // targetFilePath 迁移文件的路径
            // var targetFilePath = Path.join(baseTarget, file);
            var targetFilePath = getBaseFileTimeName(filePath, file);
            fs.stat(targetFilePath, (err, statsT) => {
              if (err) {
                console.log(Color("red", err.message));
              }
              // 如果是markdown文件则可以迁移
              if (/\.md/.test(file)) {
                // 如果文件存在，判断修改日期是否相同
                if (statsT != undefined) {
                  // 源文件的文件属性
                  const statsB = fs.statSync(filePath);

                  if (statsT.mtime.getTime() != statsB.mtime.getTime()) {
                    console.log(
                      Color("yellow", "[文件发生修改正在迁移]" + filePath + "==>" + targetFilePath)
                    );
                    fileMigration(filePath, file);
                  } else {
                    console.log(Color("blue", "[无修改无需迁移]" + filePath));
                  }
                } else {
                  // 如果文件不存在迁移文件
                  fileMigration(filePath, file);
                }
              } else {
                console.log(Color("yellow", "[文件不符]" + filePath + "不是合法的markdown文件"));
              }
            });
          }
        }
      });
    });
  });
}

// 添加title
function addHexoTitle(title, date, subtitle, cover, tags, categories) {
  var defaultHexoData = `---\ntitle: ${title}\ncatalog: true\ndate: ${date}\nsubtitle: ${subtitle}\ncover: ${cover}\nlang: cn\ntags: \n- ${tags}\ncategories:\n- ${categories}\n---\n`;
  return defaultHexoData;
}

// 获取当前日期
function getNowDate() {
  var date = new Date();
  const Y = date.getFullYear();

  const M = padZero(date.getMonth() + 1);

  const D = padZero(date.getDate());

  const h = padZero(date.getHours());
  const m = padZero(date.getMinutes());
  const s = padZero(date.getSeconds());
  return Y + "-" + M + "-" + D + " " + h + ":" + m + ":" + s;
}

// 时间补零函数
function padZero(value) {
  return value > 9 ? value : "0" + value;
}

// 修改文件属性
function changeFileAttr(filePath, aTime, mTime) {
  fs.utimes(filePath, aTime, mTime, function (err) {
    if (err) {
      console.log(Color("red", "[文件时间修改失败]" + err.message));
    }

    console.log(Color("yellow", "[文件时间修改成功]" + filePath));
  });
}

// 获取原文件时间戳和文件名组合字符串
function getBaseFileTimeName(filePath, file) {
  const stats = fs.statSync(filePath);
  var newFilePath = Path.join(baseTarget, stats.birthtime.getTime().toString() + file);
  return newFilePath;
}

// filePath 原文件地址
// file 原文件的文件名
function fileMigration(filePath, file) {
  // 迁移Markdown文件
  console.log(Color("blue", "[正在读取文件]" + filePath));
  fs.readFile(filePath, (err, result) => {
    if (err) {
      console.log(Color("red", ["文件读取错误" + err.message]));
    }
    // 没有经过加工的markdown数据
    var data = result.toString();
    // 判断当中是否有本地图片
    var isExit = regexpImage.test(data);
    // 替换markdown中的图片路径
    if (isExit) {
      console.log(Color("yellow", "[替换数据]" + filePath));
      // 正则表达式切换标签
      data = data.replace(regexpImage, (match) => {
        var newImageTag =
          "![](../img" + match.substring(match.lastIndexOf("/"), match.lastIndexOf(")")) + ")";
        return newImageTag;
      });
    }
    // 写入新的markdown文件的地址
    // var target = baseTarget + file;
    var target = getBaseFileTimeName(filePath, file);
    // markdown文件的tag属性
    var tags = filePath.split("\\");
    // markdown文件的title属性
    var title = file.substring(0, file.lastIndexOf("."));
    //获取随机封面
    var coverImages = fs.readdirSync(Path.join(__dirname, "/source/img/"));
    var randomCover = coverImages[Math.floor(Math.random() * coverImages.length)];
    // 写入markdown文件
    fs.writeFile(
      target,
      addHexoTitle(
        title,
        getNowDate(),
        title,
        `/img/${randomCover}`,
        tags[tags.length - 2],
        tags[tags.length - 2]
      ) + data,
      (err) => {
        if (err) {
          console.log(Color("red", "[迁移失败]" + err.message));
        }
        console.log(Color("green", "[迁移成功]" + filePath + "->" + target));
        // 获取源文件的属性
        fs.stat(filePath, (err, stats) => {
          if (err) {
            console.log(Color("red", "[迁移文件属性获取失败]" + err.message + "=>" + target));
          }
          // 修改迁移文件的的创建时间,修改时间
          changeFileAttr(target, stats.atime, stats.mtime);
        });
      }
    );
  });
}
